import router from '@/router'
import store from '@/store'
import NProgress from 'nprogress' // 浏览器加载进度条组件
import 'nprogress/nprogress.css' // 浏览器加载进度条样式
const config = require('@/config/settings')

// 配置进度条
NProgress.configure({
  showSpinner: false
})

// 初始化路由白名单和缓存路由
store.dispatch('initWhiteListAndCacheViews', {
  val1: router.options.routes,
  val2: ['/', process.env.BASE_URL.substring(0, process.env.BASE_URL.length - 1),
    ...config.router.whiteList]
})



// ————————————————导航守卫—————————————————————————————————————————
/**
 * beforeEach是router的钩子函数，在进入路由前执行
 * @param to 要去的路由
 * @param from 从哪个路由来
 * @param next 执行跳转路由的方法
 */
router.beforeEach((to, from, next) => {
  // 浏览器加载进度条开始
  NProgress.start()
  // 校验是否有匹配项
  if (to.matched.length === 0) {
    next({
      path: '/exception'
    })
  }
  // 判断是否有标题,没有标题就用环境默认的
  document.title = process.env.VUE_APP_TITLE
  // 是否校验当前权限
  if (config.router.loginLock) {
    // 去的地址是否在白名单内
    if (!isWhiteRoute(to.path)) {
      // 校验当前是否有登录状态
      if (window.sessionStorage.getItem('access_token')) {
        forward(to, from, next)
      } else {
        next('/login')
      }
    } else {
      next()
    }
  } else {
    next()
  }
  // 浏览器加载进度条结束
  NProgress.done()
})

/**
 * 后置守卫
 */
router.afterEach((to, from) => {
  NProgress.done() // finish progress bar
})



// 路由白名单校验
function isWhiteRoute (path) {
  const whiteList = store.getters.getWhiteList
  if (whiteList.common.includes(path)) {
    return true
  }
  for (let i = 0; i < whiteList.all.length; i++) {
    if (path.startsWith(whiteList.all[i])) {
      return true
    }
  }
  return false
}

// 前往权限控制
async function forward (to, from, next) {
  const path = to.path.replaceAll('/','-').substring(1,to.path.length)
  // 先做权限过滤，将主store中的routers筛选成拥有权限的路由结果

  const perRoutes = store.getters.getPermissionRoutes
  // 如果去到路径path是以dafault结尾，则跳转到第一个有权限的子路由
  if (perRoutes.defaultRoutes.includes(path)) {
    if (!perRoutes.permissionRoutes.includes(path)) {
      next({
        path: '/exception/content/403'
      })
    } else {
      next()
    }
  } else {
    next({
      path: '/exception'
    })
  }
}
